package day07;

/*
    形式参数的问题:
        基本类型:形式参数的改变不影响实际参数
        引用类型:形式参数的改名直接影响实际参数
 */

//形式参数时基本类型
class Demo{
    public int sum(int a,int b){
        return a + b;
    }
}

//形式参数时引用类型
class Student{
    public void show(){
        System.out.println("学生爱学习!");
    }

    //获取实例匿名对象方法
    public Student getInstance(){
        return new Student();
    }

    public Student show1(){
        System.out.println("学生爱学习!");
        return new Student();
    }
}

class StudentDemo{
    //如果你看到一个方法的形式参数是一个类类型(引用类型)
    //这里其实需要的是该类的对象
    public void method(Student s){
        s.show();
    }


}


public class ArgsTest {
    public static void main(String[] args){
        //形式参数时基本类型的调用
        Demo d = new Demo();
        int result = d.sum(10,20);
        System.out.println(result);

        //形式参数时引用类型
        //需求:我要调用StudentDemo类中的method方法
        StudentDemo studentDemo = new StudentDemo();
        Student student = new Student();
        studentDemo.method(student);//把student的地址给到了这里,跳转到method方法中,
        // 参数列表中public void method(Student s)等价于Student s = new Student();
        //所以创建了一个对象名为"s"的Student对象,直接调用了Student类中的成员方法show()方法
        //打印出  学生爱学习!

        System.out.println("-------------");

        //为了规范代码和提高代码的复用性,可以创建一个获取实例对象的方法(匿名对象),来重复使用,节省内存
        studentDemo.method(student.getInstance());

        //就可以实现快捷调用类中的方法
        student.getInstance().show();

        System.out.println("-------------");

        //结合这样的特性,又有新的用法
        //方法中不断返回匿名对象,再用匿名对象使用方法,方法又返回匿名对象的用法
        //其实在后面将会学到
        //这种现象叫做:链式编程
            student.show1().show1().show1().show1().show1().show1();//... ...
        }
}
